I am still trying to understand why do I have to use the brackets when deleting an array. and no brackets other wise.
CornedBee wrote :
It's got, among other things, something to do with destructors. Only with [] does delete know to call more than one destructor. (Which doesn't give you permission to mix them if the underlying object doesn't have a destructor.)

So I wrote this little example, and understod part of it.

Code:
#include <iostream>
#include <mylib.h>

#define  N   3

class mstr 
  {
  char   *str;
public :
  mstr(void)
     {
     str = NULL;
     }
   void add_new(const char *s)
     {
     str = new char[strlen(s)+1];
     strcpy(str, s);
     }
    ~mstr(void)
    {
    if ( str )
      {
       printf("delete %s\n", str);
       delete str;
       }
    }
    void show(void)
    {
    printf("%s\n", str);
    }
};


class strt
{
   public :
   mstr  *tbl;
   strt(void)
     {
     tbl = new mstr[N];
     tbl[0].add_new("strt :one");
     tbl[1].add_new("strt :two");
     tbl[2].add_new("strt :three");
     }
   void disp_tbl(void)
     {
     for ( int i = 0 ; i < N ; ++i )       
         tbl[i].show();
     }
};



int   main(void)
{
strt  st1, st2;
int   *p = new int[5];

delete p;  // I dont use bracktes and dont crash here !!!!

st1.disp_tbl();

printf("===> delete []st1.tbl <=== : \n");
delete  []st1.tbl;


printf("===> delete st2.tbl <=== : \n");
delete  st2.tbl; // I dont use bracktes and DO crash here !!!!


return(0);
}

I see that when I call "delete []st1.tbl" , with brackets it also call
delete for mstr[0] mstr[1] mstr[2].

But why does the program crash with "delete st2.tbl" ?

The output is :
strt ne
strt :two
strt :three
===> delete []st1.tbl <=== :
delete strt :three
delete strt :two
delete strt ne
===> delete st2.tbl <=== :
delete strt ne
Abort (core dumped)